iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
自我挑戰組

新手也想開始認識機器學習系列 第 22

Day 22 貝式分類器 Bayesian Classifier

  • 分享至 

  • xImage
  •  

介紹:

貝式分類器(Bayesian Classifier)是一種基於機率模型的機器學習模型。它有很多名稱,又叫做貝葉斯分類器、簡單貝葉斯、樸素貝葉斯...等。其根據貝氏定理(Bayes' theorem)為基礎,透過機率統計來判斷未知的資料類別。

貝式定理

貝氏定理描述在一些已知的一些條件下,某件事發生的機率。就像是我們能透過過去的天氣狀況來預測明天的天氣那樣。
貝式定理公式為:
https://chart.googleapis.com/chart?cht=tx&chl=P(A%7CB)%3D%5Cfrac%7BP(B%7CA)*P(A)%7D%7BP(B)%7D

P(A)為 A 事件的出現機率;P(B)為 B 事件的出現機率;
P(A|B)代表在 B 事件發生的前提下, A 事件出現的機率;
P(B|A)代表在 A 事件發生的前提下, B 事件出現的機率;
A 和 B 為皆為隨機事件,且P(B)機率不為。

打個比方吧。
假設某一間大學內大一、大二、大三、大四的學生分別佔了22%、28%、24%、26%;
而大一至大四女學生的佔比分別為 40%、30%、20%、15%。
假設我今天在大學內遇到一位女學生,該位女學生為大一的機率是多少?

此時我們套用公式,將P(B)視為遇到女學生的機率、P(A)視為遇到大一學生的機率,因此:
遇到女學生的機率:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(B)%20%3D%200.40.22%20%2B%200.300.28%20%2B%200.20.24%20%2B%200.150.26%20%3D%200.259%24
遇到大一學生的機率:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(A)%20%3D%200.22%24
在大一的學生中遇到女生的機率:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(B%7CA)%20%3D%200.4%24
所以答案就是https://chart.googleapis.com/chart?cht=tx&chl=%24%5Cfrac%7B0.4*0.22%7D%7B0.259%7D%3D%5Cfrac%7B88%7D%7B259%7D%3D%5Cfrac%7B88%7D%7B259%7D%24≈0.34

以此類推,我們是不是就能利用這種單純的方法應用至其他領域,推測出其他領域的資料了呢?比如說:

  1. 新聞內出現『蔡英文』,該新聞被分類為政治文章的機率
  2. 標題帶有『幾X億人都震驚了!』的文章是垃圾農場文的機率
  3. 空氣中有雨味,看到路邊螞蟻在搬家,接下來會下大雨的機率
  4. 花200萬鑽石,在《天堂M》裡抽中紫布的機率

貝式分類器

從上面提出的例子我們可以知道貝式定理用來分析機率的方法。而貝式分類器就是這麼一個機率模型分類器。因此所有的模型參數都可以通過訓練集的相關頻率來估計。而不同的資料集自然會有不一樣的訓練架構,以下是幾個比較常用的貝式分類架構:

1. 高斯貝式分類器 GaussianNB:
主要用於特徵為連續變數並符合符合常態分佈時。像是年紀大小與罹患癌症的機率、體重大小與罹患心血管疾病的機率...等。
首先對資料進行類別分類,假設訓練集中有一個連續屬性 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 ,然後計算每個類別中 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 的均值和變異數。令 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20%5Cmu%20_%7Bc%7D%7D%24%20表示為 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 在 c 類上的均值,令 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20%5Csigma%20_%7Bc%7D%5E%7B2%7D%7D%24https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 在 c 類上的變異數。

機率計算公式如下:
https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20P(x%3Dv%7Cc)%3D%7B%5Cfrac%20%7B1%7D%7B%5Csqrt%20%7B2%5Cpi%20%5Csigma%20_%7Bc%7D%5E%7B2%7D%7D%7D%7D%5C%2Ce%5E%7B-%7B%5Cfrac%20%7B(v-%5Cmu%20_%7Bc%7D)%5E%7B2%7D%7D%7B2%5Csigma%20_%7Bc%7D%5E%7B2%7D%7D%7D%7D%7D%24
看不懂也沒關係,總之你只要知道高斯貝式會透過這種方法將連續的數值離散化。而為什麼我們要把數值離散化?
因為當訓練樣本數量較少或者是已知精確分布時,通過機率分布的方法或許能表現的不錯,但是在大量樣本的情形下,我們可以學習到更多資料的分布,因此離散化的方法表現會更加優秀。所以單純貝氏方法大多都會用離散化方法,而不是機率分布估計的方法。

2. 多項式貝氏分類器 MultinomialNB:
多項式貝氏分類器主要用在特徵為離散變數的情況,比方說次數、類別等等。像是公司人數與員工工作效能的關係、商品不良數與員工偷懶的機率...等。而在個模型中,會多一個 α 參數,也就是平滑化的處理。在不設定的情況下,α 預設為1.0,機率計算公式如下:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(Y_k)%3D%5Cfrac%7BN_%7BY_k%7D%2B%5Calpha%7D%7BN%2Bk_%5Calpha%7D%24%20
https://chart.googleapis.com/chart?cht=tx&chl=%24P(X_i%7CY_k)%3D%5Cfrac%7BN_%7BY_k%2Cx_i%7D%2B%5Calpha%7D%7BN_%7BY_k%7D%2Bn%5Calpha%7D%24
N 是總樣本數、k 是總類別數、https://chart.googleapis.com/chart?cht=tx&chl=%24N_%7BY_k%7D%24 是類別為 https://chart.googleapis.com/chart?cht=tx&chl=%24Y_k%24 的數量、 n 是特徵的維數、https://chart.googleapis.com/chart?cht=tx&chl=%24N_%7BY_k%2Cx_i%7D%24 是類別為 https://chart.googleapis.com/chart?cht=tx&chl=%24Y_k%24 的樣本中,第 i 維特徵值為 https://chart.googleapis.com/chart?cht=tx&chl=%24x_i%24 的樣本數。

3. 伯努力貝氏分類器 BernoulliNB:
與多項式的模型一樣,伯努力貝氏分類器也適用於離散特徵的狀況,但不同的是伯努力模型的特徵取值只能是 1 和 0 的二元特徵。比方說某個單字曾在該文章內出現過,則該篇文章特徵值為 1 ,沒有出現則是 0 。

其條件計算的方式為:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(x_i%7Cy)%3DP(i%7Cy)x_i%20%2B%20(1-P(i%7Cy))(1-x_i)%24

實作:

一樣透過iris資料集進行簡單的分類實作:

from sklearn.naive_bayes import GaussianNB          # 高斯貝氏分類器 GaussianNB
from sklearn.naive_bayes import MultinomialNB     # 多項式貝氏分類器 MultinomialNB
from sklearn.naive_bayes import BernoulliNB         # 伯努力貝氏分類器 Bernoulli NB
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris=datasets.load_iris()
X=iris.data
Y=iris.target

# 拆分成訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

model=GaussianNB()                         # 這裡使用高斯貝氏分類器
model.fit(X_train,y_train)

print(model.predict(X_test))            # 印出測試的預測結果
print(y_test)                                           # 印出測試答案
print(model.score(X_test,y_test))   # 印出預測準度

reference

https://blog.csdn.net/u012162613/article/details/48323777

https://pyecontech.com/2020/03/06/python_bayesian_classifier/

https://zh.wikipedia.org/zh-tw/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%88%86%E7%B1%BB%E5%99%A8

那假設有一群尚未分類的資料,我們要怎麼分類呢?
那就是非監督式學習的問題了。
明天就讓我們聊聊非監督式學習中的K-Means吧!


上一篇
Day 21 支援向量機 SVM
下一篇
Day 23 K-平均演算法 K-Means
系列文
新手也想開始認識機器學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言